;void monocromatizarProm (char* red, char* green, char* blue, unsigned int tam, char* resultado)

global monocromatizarProm

section .text
%define		red [ebp + 8]
%define		green [ebp + 12]
%define		blue [ebp + 16]
%define		tam [ebp + 20]
%define		res [ebp + 24]

monocromatizarProm:
	push		ebp
	mov		ebp, esp
	push		ebx
	push		edi
	push		esi

;INICIALIZACION:
;esi = puntero a la matriz con los Red
;edx = puntero a la matriz con los Green
;ebx = puntero a la matriz con los Blue
;ecx = columnas faltantes de la fila actualmente recorrida
;edi = puntero a la matriz resultado
inicializacion:
	mov		esi, red
	mov		edx, green
	mov		ebx, blue
	mov		ecx, tam
	mov		edi, res

ciclo:
	cmp		ecx, 8
	jae		usarMMX

;  Si no puedo usar MMX, uso registros de 32 bits y avanzo de a 1 pixel
;  eax = (R + 2*G + B)/4

	xor		eax, eax
	mov		al, [esi]
	add		al, [edx]
	adc		ah, 0
	add		al, [edx]
	adc		ah, 0
	add		al, [ebx]
	adc		ah, 0
	shr		ax, 2

	mov		[edi], al
	inc		esi
	inc		edx
	inc		ebx
	inc		edi   
	loop		ciclo
	jmp		fin

usarMMX:
;  mm1 = 4 pixels
;	mm2 = 4 pixels siguientes

	pxor		mm0, mm0
	movq		mm1, [esi]
	movq		mm2, mm1
	punpcklbw	mm1, mm0
	punpckhbw	mm2, mm0

	movq		mm3, [edx]
	movq		mm4, mm3
	punpcklbw	mm3, mm0
	punpckhbw	mm4, mm0

	paddw		mm1, mm3
	paddw		mm2, mm4
	paddw		mm1, mm3
	paddw		mm2, mm4

	movq		mm3, [ebx]
	movq		mm4, mm3
	punpcklbw	mm3, mm0
	punpckhbw	mm4, mm0

	paddw		mm1, mm3
	paddw		mm2, mm4

	psrlw		mm1, 2
	psrlw		mm2, 2

	packuswb	mm1, mm2
	movq		[edi], mm1

	add		esi, 8
	add		edx, 8
	add		ebx, 8
	add		edi, 8
	sub		ecx, 8
	cmp		ecx, 0
	je			fin
	jmp		ciclo

fin:
	pop		esi
	pop		edi
	pop		ebx
	pop		ebp
	ret